/*************************************************
 * 
 * Copyright by Bruno Eberhard
 * 
 * Created on 20.08.2006
 *
 *************************************************/
package fightplan.business;

import java.beans.PropertyChangeListener;
import java.beans.PropertyChangeSupport;

import com.jgoodies.binding.value.AbstractValueModel;

import fightplan.core.Util;

/**
 * Die FighterHolders werden von den Fights zu Verfügung gestellt.
 */
public class FighterHolder extends AbstractValueModel implements ModifiableFighterProvider {
	private static final long serialVersionUID = 1L;

	/**
	 * Die persistenten ChangeListener sind diejenigen, die auch nach einem
	 * save/load noch vorhanden sein sollten. Also diejenigen, die nicht mit dem
	 * UI, sondern mit dem Model zu tun haben. (Das Problem ist, dass die
	 * Listener im AbstractValueModel transient gespeichert sind, und damit die
	 * Model-Updates nach einem Load nicht mehr funktionieren)
	 */
	private PropertyChangeSupport persistentChangeListeners;

	private AbstractFighter fighter = null;

	private Fight fight;

	public FighterHolder(Fight fight) {
		if (fight == null)
			throw new IllegalArgumentException();
		this.fight = fight;
	}

	/**
	 * @return Der Kampf, von dem der ausgewählte Kämpfer abhängt. (Muss nicht
	 *         unbedingt der Gewinner dieses Kampfes sein)
	 */
	public Fight getFight() {
		return fight;
	}

	public Object getValue() {
		return fighter;
	}

	public AbstractFighter getFighter() {
		return fighter;
	}

	public void setValue(Object newValue) {
		AbstractFighter newFighter = (AbstractFighter) newValue;
		AbstractFighter oldFighter = getFighter();
		if (Util.equals(oldFighter, newValue))
			return;
		fighter = newFighter;
		fireValueChange(oldFighter, newFighter, true); // check identity
		if (persistentChangeListeners != null) {
			persistentChangeListeners.firePropertyChange(PROPERTYNAME_VALUE, oldFighter, newFighter);
		}
	}

	public void setFighter(AbstractFighter fighter) {
		setValue(fighter);
	}

	public void addPersistentChangeListener(PropertyChangeListener listener) {
		if (persistentChangeListeners == null) {
			persistentChangeListeners = new PropertyChangeSupport(this);
		}
		persistentChangeListeners.addPropertyChangeListener(listener);
	}

	public void removePersistentChangeListener(PropertyChangeListener listener) {
		if (persistentChangeListeners != null) {
			persistentChangeListeners.removePropertyChangeListener(listener);
		}
	}

}
